'''
定义接口测试用例
使用unittest
1.导包
2.创建测试类
    2.1 前置处理
    2.2 后置处理
    2.3 创建测试方法
'''
# 接口测试参数化
# 1.分析需要参数化的参数，都有哪些？
#       输入数据：用户名、密码、验证码
#       预期结果：content_type、状态码、业务码、业务消息
# 2、选择数据承载形式
#       json
#       db
# 3.修改测试用例中的代码
#       3.1构建参数化数据（build_data）
#       3.2在测试用例前引用参数化(@parameterized)
#       3.3在具体的测试用例中、按照获得的数据进行参数替换
# 基于数据库实现参数化
# 1.导包
import requests
import unittest
from API.login import LoginAPI
from lib.dbutil import DBUtil
from parameterized import parameterized

# 构造测试数据
def build_data():
    sql = "select * from t_login"
    db_data = DBUtil.exe_sql(sql)
    print(db_data)

    test_data = []
    for case_data in db_data:
        username = case_data[2]
        password = case_data[3]
        verify_code = case_data[4]
        status_code = case_data[5]
        content_type = case_data[6]
        status = case_data[7]
        msg = case_data[8]
        test_data.append((username,password,verify_code,status_code,content_type,status,msg))
        print("test_data = {}".format((username,password,verify_code,status_code,content_type,status,msg)))
    return test_data
# 2.定义测试类
class TestLoginAPI(unittest.TestCase):
    # 2.1 前置处理
    def setUp(self):
        self.login_api = LoginAPI()
        self.session = requests.Session()

    # 2.2 后置处理
    def tearDown(self):
        if self.session:
            self.session.close()

    # 2.3 创建测试方法
    # @parameterized.expand(build_data)
    @parameterized.expand(build_data())
    def test01_login(self,username,password,verify_code,status_code,content_type,status,msg):
        # 调用验证码接口
        response = self.login_api.get_verify_code(self.session)
        # 断言
        self.assertEqual(status_code, response.status_code)
        self.assertIn(content_type,response.headers.get("Content-Type"))

        # 调用登录接口
        response = self.login_api.login(self.session,username,password,verify_code)
        print(response.json())
        # 断言
        self.assertEqual(status_code,response.status_code)
        self.assertEqual(status,response.json().get("status"))
        self.assertIn(msg,response.json().get("msg"))

